#ifndef __UMALLOC_H__
#define __UMALLOC_H__

#include <stdio.h>
#include <stdlib.h>

#define MEM_SIZE 8192   // 内存池大小为8192B = 8KB
#define MIN_BLOCK_SIZE 16  // 单个页块大小为16B
#define MEM_BLOCK_SIZE MEM_SIZE/MIN_BLOCK_SIZE // 内存池的页块数目

// 内存块header结构体
typedef struct {
    size_t size;                // 内存块的大小，数值即页块的数目
    union Block* next;         // 下一个内存块
} Block_Header;

// 内存块联合体，可当作空闲内存块的header或内存块，使得header刚好占用一个页块
typedef union{
    Block_Header header;
    char room[MIN_BLOCK_SIZE]; 
} Block;


// 内存池
static char mem[MEM_SIZE];
// 空闲块链表
static Block* free_area;

// 功能函数
void* umalloc(size_t );         // 内存分配函数
void ufree(void* );             // 内存释放函数
void umerge(Block* );           // 碎片整理函数
// 辅助函数
void initialize_mem();          // 初始化内存池和空闲块链表
void display_free();            //查看空闲块链表函数

#endif